10036
20441
Dlaczego niektóre losowe ciągi generują kolory, gdy są wprowadzane jako kolory tła w HTML? Na przykład:
 test 
... tworzy dokument z czerwonym tłem we wszystkich przeglądarkach i platformach.
Co ciekawe, podczas gdy chucknorri również tworzy czerwone tło, chucknorr tworzy żółte tło.
Co tu się dzieje? 
To pozostałość po czasach Netscape:
Brakujące cyfry są traktowane jako 0 [...]. Nieprawidłowa cyfra jest po prostu interpretowana jako 0. Na przykład wartości # F0F0F0, F0F0F0, F0F0F, #FxFxFx i FxFxFx są takie same.
Pochodzi z wpisu na blogu Trochę tyrady na temat parsowania kolorów w Microsoft Internet Explorer, które szczegółowo opisuje, w tym różne długości wartości kolorów itp.
Jeśli zastosujemy zasady z kolei z wpisu na blogu, otrzymamy:
Zamień wszystkie niepoprawne znaki szesnastkowe na 0:
chucknorris staje się c00c0000000
Dopełnij następną całkowitą liczbę znaków podzielną przez 3 (11 → 12):
c00c 0000 0000
Podziel na trzy równe grupy, gdzie każdy składnik reprezentuje odpowiadający mu składnik koloru RGB:
RGB (c00c, 0000, 0000)
Obetnij każdy z argumentów od prawej strony do dwóch znaków.
Co ostatecznie daje następujący wynik:
RGB (c0, 00, 00) = # C00000 lub RGB (192, 0, 0)
Oto przykład demonstrujący działanie atrybutu bgcolor, aby uzyskać tę „niesamowitą” próbkę koloru:
chuck norris Pan T ninjaturtle
chore bzdury trawa
To również odpowiada na inną część pytania: dlaczego bgcolor = "chucknorr" daje żółty kolor? Cóż, jeśli zastosujemy reguły, ciąg to: c00c00000 => c00 c00 000 => c0 c0 00 [RGB (192, 192, 0)] Co daje jasnożółty złoty kolor. Ponieważ ciąg zaczyna się od 9 znaków, tym razem trzymamy drugie „C”, dlatego kończy się na ostatecznej wartości koloru. Pierwotnie spotkałem się z tym, gdy ktoś wskazał, że możesz zrobić kolor = "gówno" i, cóż, wychodzi brązowy. | Przykro mi, że się nie zgadzam, ale zgodnie z zasadami analizy starszej wartości koloru opublikowanej przez @Yuhong Bao, chucknorris NIE równa się # CC0000, ale raczej # C00000, bardzo podobny, ale nieco inny odcień czerwieni. Użyłem dodatku Firefox ColorZilla, aby to sprawdzić. Zasady mówią: nadaj łańcuchowi długość będącą wielokrotnością 3, dodając 0s: chucknorris0 rozdziel strunę na 3 równe struny: chuc knor ris0 obetnij każdy ciąg do 2 znaków: ch kn ri zachowaj wartości szesnastkowe i dodaj 0 w razie potrzeby: C0 00 00 Udało mi się użyć tych reguł, aby poprawnie zinterpretować następujące ciągi: LuckyCharms Szczęście LuckBeALady LuckBeALadyTonight Styl Gangnam AKTUALIZACJA: Pierwotni respondenci, którzy powiedzieli, że kolor to # CC0000, od tego czasu zredagowali swoje odpowiedzi, aby uwzględnić korektę. | Większość przeglądarek po prostu zignoruje wszelkie wartości inne niż szesnastkowe w łańcuchu koloru, zastępując cyfry inne niż szesnastkowe zerami. ChuCknorris tłumaczy się na c00c0000000. W tym momencie przeglądarka podzieli ciąg na trzy równe sekcje, wskazując wartości czerwonego, zielonego i niebieskiego: c00c 0000 0000. Dodatkowe bity w każdej sekcji zostaną zignorowane, co daje wynik końcowy # c00000, który jest czerwonawy. Uwaga, nie dotyczy to analizowania kolorów CSS, które są zgodne ze standardem CSS.

Czerwonawy

Tak samo jak powyżej

Czarny

| Powodem jest to, że przeglądarka nie może tego zrozumieć i próbuje jakoś przetłumaczyć to, co może zrozumieć, aw tym przypadku na wartość szesnastkową! ... chucknorris zaczyna się od c, które jest rozpoznawanym znakiem szesnastkowym, a także konwertuje wszystkie nierozpoznane znaki na 0! Więc chucknorris w formacie szesnastkowym wygląda następująco: c00c00000000, wszystkie inne znaki stają się 0, a c pozostaje tam, gdzie są ... Teraz są dzielone przez 3 dla RGB (czerwony, zielony, niebieski) ... R: c00c, G: 0000, B: 0000 ... Ale wiemy, że poprawna liczba szesnastkowa dla RGB to tylko 2 znaki, czyli R: c0, G: 00, B: 00 Tak więc prawdziwy wynik to: bgcolor = "# c00000"; Dodałem również kroki na obrazku jako szybkie odniesienie: | Przeglądarka próbuje przekonwertować tekst chucknorris na szesnastkowy kod koloru, ponieważ nie jest to prawidłowa wartość. W chucknorris wszystko oprócz c nie jest prawidłową wartością szesnastkową. Więc zostanie przekonwertowany na c00c00000000. Który staje się # c00000, odcieniem czerwieni. Wydaje się, że jest to problem głównie z Internet Explorer i Opera (12), ponieważ zarówno Chrome (31), jak i Firefox (26) po prostu to ignorują. P.S. Liczby w nawiasach to wersje przeglądarek, na których testowałem. Na lżejszą nutę Chuck Norris nie spełnia standardów internetowych. Zgodność ze standardami sieciowymi do niego. # BADA55 | Specyfikacja HTML WHATWG zawiera dokładny algorytm analizowania starszego koloruwartość: https://html.spec.whatwg.org/multipage/infrastructure.html#rules-for-parsing-a-legacy-colour-value. Kod Netscape Classic używany do analizowania ciągów kolorów jest open source: https://dxr.mozilla.org/classic/source/lib/layout/layimage.c#155. Na przykład zwróć uwagę, że każdy znak jest analizowany jako cyfra szesnastkowa, a następnie przenoszony do 32-bitowej liczby całkowitej bez sprawdzania przepełnienia. Tylko osiem cyfr szesnastkowych mieści się w 32-bitowej liczbie całkowitej, dlatego bierze się pod uwagę tylko 8 ostatnich znaków. Po przeanalizowaniu cyfr szesnastkowych na 32-bitowe liczby całkowite są one następnie obcinane do 8-bitowych liczb całkowitych, dzieląc je przez 16, aż zmieszczą się do 8-bitowych, dlatego zera wiodące są ignorowane. Aktualizacja: ten kod nie jest dokładnie zgodny z tym, co zdefiniowano w specyfikacji, ale jedyną różnicą jest kilka wierszy kodu. Myślę, że to właśnie te linie zostały dodane (w Netscape 4): if (bytes_per_val> 4) { bytes_per_val = 4; } | Odpowiedź: Przeglądarka spróbuje przekonwertować chucknorris na wartość szesnastkową. Ponieważ c jest jedynym prawidłowym znakiem szesnastkowym w chucknorris, wartość zamienia się na: c00c00000000 (0 dla wszystkich wartości, które były nieprawidłowe). Przeglądarka następnie dzieli wynik na 3 grupy: czerwony = c00c, zielony = 0000, niebieski = 0000. Ponieważ prawidłowe wartości szesnastkowe dla tła html zawierają tylko 2 cyfry dla każdego typu koloru (r, g, b), ostatnie 2 cyfry są obcinane z każdej grupy, pozostawiając wartość rgb c00000, która jest ceglastoczerwonym kolorem. | chucknorris zaczyna się od litery c, a przeglądarka odczytuje ją jako wartość szesnastkową. Ponieważ A, B, C, D, E i F to znaki szesnastkowe. Przeglądarka konwertuje chucknorris na wartość szesnastkową C00C00000000. Następnie wartość szesnastkowa C00C00000000 jest konwertowana na format RGB (podzielona przez 3): C00C00000000 ⇒ R: C00C, G: 0000, B: 0000 Przeglądarka potrzebuje tylko dwóch cyfr do wskazania koloru: R: C00C, G: 0000, B: 0000 ⇒ R: C0, G: 00, B: 00 ⇒ C00000 Na koniec pokaż bgcolor = C00000 w przeglądarce internetowej. Oto przykład demonstrujący to:
chucknorris c00c00000000 c00000
| Zasady analizowania kolorów w starszych atrybutach obejmują dodatkowe kroki niż te wymienione w istniejących odpowiedziach. Obcięcie komponentu do części 2-cyfrowej jest opisane następująco: Odrzuć wszystkie postacie z wyjątkiem ostatnich 8 Odrzuć wiodące zera jeden po drugim, jeśli wszystkie składniki mają wiodące zero Odrzuć wszystkie postacie z wyjątkiem pierwszych 2 Kilka przykładów: oooFoooFoooF 000F 000F 000F <- wymień, podkład i kawałek 0F 0F 0F <- zera wiodące obcięte 0F 0F 0F <- obcięte do 2 znaków od prawej oooFooFFoFFF 000F 00FF 0FFF <- wymień, podkład i kawałek 00F 0FF FFF <- zera wiodące obcięte 00 0F FF <- obcięte do 2 znaków od prawej ABCooooooABCooooooABCoooooo ABC000000 ABC000000 ABC000000 <- wymień, podkład i kawałek BC000000 BC000000 BC000000 <- obcięte do 8 znaków od lewej BC BC BC <- obcięte do 2 znaków od prawej AoCooooooAoCooooooAoCoooooo A0C000000 A0C000000 A0C000000 <- wymienić, pad i kawałek 0C000000 0C000000 0C000000 <- obcięte do 8 znaków od lewej C000000 C000000 C000000 <- początkowe zera obcięte C0 C0 C0 <- obcięte do 2 znaków od prawej Poniżej znajduje się częściowa implementacja algorytmu. Nie obsługuje błędów ani przypadków, w których użytkownik wprowadzi prawidłowy kolor. function parseColor (input) { // todo: zwróć błąd, jeśli dane wejściowe to „” input = input.trim (); // todo: zwraca błąd, jeśli dane wejściowe są „przezroczyste” // todo: zwraca odpowiedni #rrggbb, jeśli wejście ma nazwany kolor // todo: return #rrggbb, jeśli dane wejściowe pasują do #rgb // todo: zamień punkty kodowe Unicode większe niż U + FFFF na 00 if (input.length> 128) { input = input.slice (0, 128); } if (input.charAt (0) === "#") { input = input.slice (1); } input = input.replace (/ [^ 0-9A-Fa-f] / g, "0"); while (input.length === 0 || input.length% 3> 0) { wejście + = "0"; } var r = input.slice (0, input.length / 3); var g = input.slice (input.length / 3, input.length * 2/3); var b = input.slice (input.length * 2/3); if (r.length> 8) { r = r. plaster (-8); g = g. plaster (-8); b = b. plaster (-8); } while (r.length> 2 && r.charAt (0) === "0" && g.charAt (0) === "0" && b.charAt (0) === "0") { r = r. plaster (1); g = g. plaster (1); b = b. plaster (1); } if (r.length> 2) { r = r. plaster (0,2); g = g. plaster (0, 2); b = b. plaster (0, 2); } return "#" + r.padStart (2, "0") + g.padStart (2, "0") + b.padStart (2, "0"); } $ (funkcja () { $ ("# wejście"). on ("zmień", funkcja () { var input = $ (this) .val (); var color = parseColor (input); var $ cell = $ ("# wynik tbody td"); $ cells.eq (0) .attr ("bgcolor", wejście); $ cells.eq (1) .attr ("bgcolor", kolor); varwartość: https://html.spec.whatwg.org/multipage/infrastructure.html#rules-for-parsing-a-legacy-colour-value. Kod Netscape Classic używany do analizowania ciągów kolorów jest open source: https://dxr.mozilla.org/classic/source/lib/layout/layimage.c#155. Na przykład zwróć uwagę, że każdy znak jest analizowany jako cyfra szesnastkowa, a następnie przenoszony do 32-bitowej liczby całkowitej bez sprawdzania przepełnienia. Tylko osiem cyfr szesnastkowych mieści się w 32-bitowej liczbie całkowitej, dlatego bierze się pod uwagę tylko 8 ostatnich znaków. Po przeanalizowaniu cyfr szesnastkowych na 32-bitowe liczby całkowite są one następnie obcinane do 8-bitowych liczb całkowitych, dzieląc je przez 16, aż zmieszczą się do 8-bitowych, dlatego zera wiodące są ignorowane. Aktualizacja: ten kod nie jest dokładnie zgodny z tym, co zdefiniowano w specyfikacji, ale jedyną różnicą jest kilka wierszy kodu. Myślę, że to właśnie te linie zostały dodane (w Netscape 4): if (bytes_per_val> 4) { bytes_per_val = 4; } | Odpowiedź: Przeglądarka spróbuje przekonwertować chucknorris na wartość szesnastkową. Ponieważ c jest jedynym prawidłowym znakiem szesnastkowym w chucknorris, wartość zamienia się na: c00c00000000 (0 dla wszystkich wartości, które były nieprawidłowe). Przeglądarka następnie dzieli wynik na 3 grupy: czerwony = c00c, zielony = 0000, niebieski = 0000. Ponieważ prawidłowe wartości szesnastkowe dla tła html zawierają tylko 2 cyfry dla każdego typu koloru (r, g, b), ostatnie 2 cyfry są obcinane z każdej grupy, pozostawiając wartość rgb c00000, która jest ceglastoczerwonym kolorem. | chucknorris zaczyna się od litery c, a przeglądarka odczytuje ją jako wartość szesnastkową. Ponieważ A, B, C, D, E i F to znaki szesnastkowe. Przeglądarka konwertuje chucknorris na wartość szesnastkową C00C00000000. Następnie wartość szesnastkowa C00C00000000 jest konwertowana na format RGB (podzielona przez 3): C00C00000000 ⇒ R: C00C, G: 0000, B: 0000 Przeglądarka potrzebuje tylko dwóch cyfr do wskazania koloru: R: C00C, G: 0000, B: 0000 ⇒ R: C0, G: 00, B: 00 ⇒ C00000 Na koniec pokaż bgcolor = C00000 w przeglądarce internetowej. Oto przykład demonstrujący to:
chucknorris c00c00000000 c00000
| Zasady analizowania kolorów w starszych atrybutach obejmują dodatkowe kroki niż te wymienione w istniejących odpowiedziach. Obcięcie komponentu do części 2-cyfrowej jest opisane następująco: Odrzuć wszystkie postacie z wyjątkiem ostatnich 8 Odrzuć wiodące zera jeden po drugim, jeśli wszystkie składniki mają wiodące zero Odrzuć wszystkie postacie z wyjątkiem pierwszych 2 Kilka przykładów: oooFoooFoooF 000F 000F 000F <- wymień, podkład i kawałek 0F 0F 0F <- zera wiodące obcięte 0F 0F 0F <- obcięte do 2 znaków od prawej oooFooFFoFFF 000F 00FF 0FFF <- wymień, podkład i kawałek 00F 0FF FFF <- zera wiodące obcięte 00 0F FF <- obcięte do 2 znaków od prawej ABCooooooABCooooooABCoooooo ABC000000 ABC000000 ABC000000 <- wymień, podkład i kawałek BC000000 BC000000 BC000000 <- obcięte do 8 znaków od lewej BC BC BC <- obcięte do 2 znaków od prawej AoCooooooAoCooooooAoCoooooo A0C000000 A0C000000 A0C000000 <- wymienić, pad i kawałek 0C000000 0C000000 0C000000 <- obcięte do 8 znaków od lewej C000000 C000000 C000000 <- początkowe zera obcięte C0 C0 C0 <- obcięte do 2 znaków od prawej Poniżej znajduje się częściowa implementacja algorytmu. Nie obsługuje błędów ani przypadków, w których użytkownik wprowadzi prawidłowy kolor. function parseColor (input) { // todo: zwróć błąd, jeśli dane wejściowe to „” input = input.trim (); // todo: zwraca błąd, jeśli dane wejściowe są „przezroczyste” // todo: zwraca odpowiedni #rrggbb, jeśli wejście ma nazwany kolor // todo: return #rrggbb, jeśli dane wejściowe pasują do #rgb // todo: zamień punkty kodowe Unicode większe niż U + FFFF na 00 if (input.length> 128) { input = input.slice (0, 128); } if (input.charAt (0) === "#") { input = input.slice (1); } input = input.replace (/ [^ 0-9A-Fa-f] / g, "0"); while (input.length === 0 || input.length% 3> 0) { wejście + = "0"; } var r = input.slice (0, input.length / 3); var g = input.slice (input.length / 3, input.length * 2/3); var b = input.slice (input.length * 2/3); if (r.length> 8) { r = r. plaster (-8); g = g. plaster (-8); b = b. plaster (-8); } while (r.length> 2 && r.charAt (0) === "0" && g.charAt (0) === "0" && b.charAt (0) === "0") { r = r. plaster (1); g = g. plaster (1); b = b. plaster (1); } if (r.length> 2) { r = r. plaster (0,2); g = g. plaster (0, 2); b = b. plaster (0, 2); } return "#" + r.padStart (2, "0") + g.padStart (2, "0") + b.padStart (2, "0"); } $ (funkcja () { $ ("# wejście"). on ("zmień", funkcja () { var input = $ (this) .val (); var color = parseColor (input); var $ cell = $ ("# wynik tbody td"); $ cells.eq (0) .attr ("bgcolor", wejście); $ cells.eq (1) .attr ("bgcolor", kolor); var